/*
 * @(#)cn.design.pattern.proxy.staticproxy 2020/4/21/0021
 *
 * Copy Right@ 人人译视界
 */


package cn.design.pattern.proxy.dynamicproxy;

import cn.design.pattern.proxy.staticproxy.ITeacherDao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * <pre>
 * @author tuwei
 *
 * @version 0.9
 *
 * 修改版本: 0.9
 * 修改日期: 2020/4/21/0021
 * 修改人 :  tuwei
 * 修改说明: 初步完成
 * 复审人 ：
 * </pre>
 */
public class ProxyFactory<T> {
	private T target;

	public ProxyFactory(T target) {
		this.target = target;
	}

	public Object getProxyInstance() {
		/**
		 * 说明
		 * 1.loader指定当前目标对象使用的类加载器，获取加载器的方法固定
		 * 2.interfaces目标对象实现的接口类型，使用泛型方式确认类型
		 * 3.h事件处理，执行目标对象方法时，会触发事件处理器的方法，会把当前执行的目标对象方法作为一个参数传入
		 */
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(),
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						System.out.println("jdk代理开始");
						Object result = method.invoke(target, args);
						System.out.println("jdk代理结束");
						return result;
					}
				});
	}
}